#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QTime>

// 引入排序可视化组件与排序/查找算法接口和具体实现
#include "sortvisualizerwidget.h"
#include "sortalgorithm.h"
#include "searchalgorithm.h"

#include "quicksort.h"
#include "bubblesort.h"
#include "insertionsort.h"
#include "selectionsort.h"
#include "mergesort.h"
#include "heapsort.h"
#include "shellsort.h"

#include "linearsearch.h"
#include "binarysearch.h"
#include "interpolationsearch.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow {
    Q_OBJECT

public:
    // 构造与析构函数
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    // 创建图例（用于图表下方颜色说明）
    void createLegendForAlgorithm(const QString &algo);  // 排序图例
    void createLegendForSearch(const QString &algo);     // 查找图例

    // 清空状态（用于切换算法或避免颜色残留）
    void clearAllState();

private slots:
    // 排序控制相关槽函数
    void onStartClicked();       // 点击“开始排序”
    void onSortStepClicked();        // 点击“单步执行”--排序
    void onSearchStepClicked();        // 点击“单步执行”--查找
    void onPauseClicked();       // 点击“暂停排序”
    void onResetClicked();       // 点击“重置”
    void onGenerateClicked();    // 点击“生成数据”
    void onTimeout();            // 定时器超时执行排序或查找步骤

    // 查找控制相关槽函数
    void onStartSearchClicked();         // 点击“开始查找”
    void onRandomTargetButtonClicked();  // 点击“随机目标”

private:
    Ui::MainWindow *ui;                          // UI 界面指针
    SortVisualizerWidget *visualizer;           // 排序图表可视化组件
    SortAlgorithm *sortAlgorithm;               // 当前排序算法对象
    SearchAlgorithm *searchAlgorithm = nullptr; // 当前查找算法对象（默认为空）
    QTimer *timer;                              // 用于动画控制的定时器
    int compareCount;                           // 当前累计比较次数
    int swapCount;                              // 当前累计交换次数
    QTime startTime;                            // 记录排序起始时间
    QVector<int> values;                        // 当前待排序或查找的数据

    // 私有方法
    void updateUI();            // 更新统计信息标签
    void setupConnections();    // 信号与槽绑定
    void createNewSort();       // 创建新的排序数据与算法
};

#endif // MAINWINDOW_H
